package com.duola.security.distributed.order.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;

/**
 * @author shkstart
 * @create 2022-01-03 14:58
 */
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
//@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@EnableResourceServer //@EnableResourceServer 注解自动增加了一个类型为 OAuth2AuthenticationProcessingFilter 的过滤器链
public class ResouceServerConfig extends ResourceServerConfigurerAdapter {

    public static final String RESOURCE_ID = "res1";

    @Autowired
    TokenStore tokenStore;


    /*
    资源配置
     */
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID)//资源id   //resourceId：这个资源服务的ID，这个属性是可选的，但是推荐设置并在授权服务中进行验证。
                .tokenStore(tokenStore)
                .stateless(true);
               // .tokenServices(tokenService()); //实现验证令牌服务  //tokenServices：ResourceServerTokenServices 类的实例，用来实现令牌服务。stateless(true);
    }
    /*
     其他的自定义权限保护规则通过 HttpSecurity 来进行配置。
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests() //通过http.authorizeRequests()来设置受保护资源的访问规则
                .antMatchers("/**") //请求匹配器，用来设置需要进行保护的资源路径，默认的情况下是保护资源服务的全部路径
                .access("#oauth2.hasScope('all')")//验证令牌的访问权限, 与认证服务中需要一样
                .and()
                .csrf().disable() //屏蔽CSRF控制 防止跨域请求伪造
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

 /*   *//*资源服务令牌解析服务*//*
    // 使用 DefaultTokenServices 在资源服务器本地配置令牌存储、解码、解析方式   ///用于认证服务和资源服务在本地一个工程
    // 使用 RemoteTokenServices 资源服务器通过 HTTP 请求来解码令牌， ///用于认证服务和资源服务不在一块
    // 每次都请求授权服务器端点 /oauth/check_token 使用授权服务的 /oauth/check_token 端点你需要在授权服务将这个端点暴露出去，以便资源服务可以进行访问，
    @Bean
    public ResourceServerTokenServices tokenService() {
        //使用远程服务请求授权服务器校验token, 必须指定校验token 的url、client_id，client_secret RemoteTokenServices
        RemoteTokenServices service = new RemoteTokenServices();
        service.setCheckTokenEndpointUrl("http://localhost:53020/uaa/oauth/check_token");
        service.setClientId("c1");
        service.setClientSecret("secret");
        return service;
    }*/

}
